package qc.module.ehs.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.exception.QCPromptException;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.common.core.utils.IdentifierUtil;
import qc.module.ehs.dto.templatehazard.TplHazardProjectDto;
import qc.module.ehs.entity.EhsTplHazardcategory;
import qc.module.ehs.entity.EhsTplHazarditem;
import qc.module.ehs.entity.EhsTplHazardproject;
import qc.module.ehs.mapper.EhsTplHazardprojectMapper;
import qc.module.ehs.repository.EhsTplHazardcategoryRepository;
import qc.module.ehs.repository.EhsTplHazarditemRepository;
import qc.module.ehs.repository.EhsTplHazardprojectRepository;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 危险源项目接口Service
 *
 * @author QuCheng Tech
 * @create 2024/5/22
 */
@Service
public class EhsTplHazardprojectService {
    
    private EhsTplHazardprojectRepository repository;

    @Autowired
    public void setRepository(EhsTplHazardprojectRepository repository) {
        this.repository = repository;
    }

    @Autowired
    private EhsTplHazardcategoryRepository hazardcategoryRepository;
    
    @Autowired
    private EhsTplHazarditemRepository hazarditemRepository;

    /**
     * 获取指定危险源类别中的项目 - 同时支持@RequestParam与@PathVariable方式
     *
     * @param hcatcd 危险源类别代码
     * @return List<TplHazardProjectDto>
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    public List<TplHazardProjectDto> getCategoryProjects(String hcatcd) throws QCPromptException {
        if (StringUtils.isBlank(hcatcd)) throw new QCPromptException("危险源类别代码不能为空");

        LambdaQueryWrapper<EhsTplHazardproject> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EhsTplHazardproject::getHcatcd,hcatcd);
        wrapper.orderByAsc(EhsTplHazardproject::getOdr);
        List<EhsTplHazardproject> ens = repository.selectList(wrapper);
        
        if (CollectionUtils.isNotEmpty(ens)){
            return EhsTplHazardprojectMapper.MAPPER.toDtoList(ens);
        }
        return null;
    }

    /**
     * 获取指定危险源项目
     *
     * @param id 危险源项目代码
     * @return TplHazardProjectDto
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    public TplHazardProjectDto getProject(String id) throws QCPromptException {
        if (StringUtils.isBlank(id)) throw new QCPromptException("危险源项目代码不能为空");
        
        EhsTplHazardproject en = repository.selectById(id);
        
        if (Objects.nonNull(en)){
            return EhsTplHazardprojectMapper.MAPPER.toDto(en);
        }
        return null;
    }

    /**
     * 新增指定危险源项目
     *
     * @param dto 危险源项目信息
     * @param isImportDB 是否为导入时添加
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    public String addProject(TplHazardProjectDto dto,boolean isImportDB){
        //1.危险源项目信息判空
        if (dto == null) return QCUnifyReturnValue.Warn("危险源项目信息不能为空");
        //if (StringUtils.isBlank(dto.getHpjtcd())) return QCUnifyReturnValue.Warn("危险源项目代码不能为空");
        if (StringUtils.isBlank(dto.getHpjtnm())) return QCUnifyReturnValue.Warn("危险源项目名称不能为空");
        if (StringUtils.isBlank(dto.getHcatcd())) return QCUnifyReturnValue.Warn("所属危险源类别不能为空");
        //if (dto.getTags() == null) return QCUnifyReturnValue.Warn("标签不能为空");
        
        //2.判断危险源项目代码是否存在，存在则提示
        //if (hpjtcdIsExist(dto.getHpjtcd())) return QCUnifyReturnValue.Warn("危险源项目代码已经存在");
        
        //3.判断危险源类别是否存在，不存在则提示
        EhsTplHazardcategory category = hazardcategoryRepository.selectById(dto.getHcatcd());
        if (Objects.isNull(category)) return QCUnifyReturnValue.Warn("危险源类别不存在");
        
        //4.dto -> entity
        EhsTplHazardproject en = EhsTplHazardprojectMapper.MAPPER.toEntity(dto);
        if (!isImportDB) en.setHpjtcd(IdentifierUtil.randomUUID());
        
        //5.保存数据
        if (repository.insert(en) < 0x1){
            return QCUnifyReturnValue.Warn("保存失败");
        }
        return QCUnifyReturnValue.Success();
    }

    /**
     * 修改指定危险源项目
     *
     * @param dto 危险源项目信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    public String updateProject(TplHazardProjectDto dto){
        //1.危险源项目信息判空
        if (dto == null) return QCUnifyReturnValue.Warn("危险源项目信息不能为空");
        if (StringUtils.isBlank(dto.getHpjtcd())) return QCUnifyReturnValue.Warn("危险源项目代码不能为空");
        if (StringUtils.isBlank(dto.getHpjtnm())) return QCUnifyReturnValue.Warn("危险源项目名称不能为空");
        if (StringUtils.isBlank(dto.getHcatcd())) return QCUnifyReturnValue.Warn("所属危险源类别不能为空");
        //if (dto.getTags() == null) return QCUnifyReturnValue.Warn("标签不能为空");

        //2.判断危险源项目代码是否存在，不存在则提示
        if (!hpjtcdIsExist(dto.getHpjtcd())) return QCUnifyReturnValue.Warn("危险源项目代码不存在");

        //3.判断危险源类别是否存在，不存在则提示
        EhsTplHazardcategory category = hazardcategoryRepository.selectById(dto.getHcatcd());
        if (Objects.isNull(category)) return QCUnifyReturnValue.Warn("危险源类别不存在");

        //4.dto -> entity
        EhsTplHazardproject en = EhsTplHazardprojectMapper.MAPPER.toEntity(dto);

        //5.更新数据
        repository.updateById(en);
        return QCUnifyReturnValue.Success();
    }

    /**
     * 删除指定危险源项目
     * 同时删除该类项目中的清单；
     *
     * @param id 危险源项目代码
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    public String deleteProject(String id){
        if (StringUtils.isBlank(id)) return QCUnifyReturnValue.Warn("危险源项目代码不能为空");
        
        //删除该项目下的清单
        LambdaQueryWrapper<EhsTplHazarditem> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EhsTplHazarditem::getHpjtcd,id);
        hazarditemRepository.delete(wrapper);
        
        repository.deleteById(id);
        return QCUnifyReturnValue.Success();
    }

    /**
     * 判断指定危险源项目代码是否存在
     *
     * @param id 危险源项目代码
     * @return true表示存在，false表示不存在
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    public boolean hpjtcdIsExist(String id){
        EhsTplHazardproject en = repository.selectById(id);
        if (Objects.nonNull(en)){
            return true;
        }
        return false;
    }

    /**
     * 获取项目中的类别代码集合
     *
     * @param hpjtcds 项目代码集合
     * @param tags 标签
     * @return List<String>
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    public List<String> getHcatcds(List<String> hpjtcds,Integer tags){
        LambdaQueryWrapper<EhsTplHazardproject> wrapper = new LambdaQueryWrapper<>();
        wrapper.select(EhsTplHazardproject::getHcatcd);
        if (CollectionUtils.isNotEmpty(hpjtcds)){
            wrapper.in(EhsTplHazardproject::getHpjtcd,hpjtcds);
        }
        if (tags != null){
            wrapper.eq(EhsTplHazardproject::getTags,tags);
        }
        List<EhsTplHazardproject> ens = repository.selectList(wrapper);
        if (CollectionUtils.isNotEmpty(ens)){
            List<String> hcatcds = ens.stream().map(EhsTplHazardproject::getHcatcd).collect(Collectors.toList());
            return hcatcds.stream().distinct().collect(Collectors.toList());
        }
        return null;
    }
}
